﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Caixa.DAO;
using Caixa.Model;

namespace Caixa.BLL
{
	public static class CaixaEletronicoBLL
	{
		#region " Variables "

		private static CaixaEletronico _caixaEletronico;
		private static Conta _contaLogada;

		#endregion

		#region " Properts "

		public static Conta ContaLogada
		{
			get
			{
				if (_contaLogada != null)
					_contaLogada = ContaBLL.GetByID(_contaLogada.ID);
				return _contaLogada;
			}
			set
			{
				_contaLogada = value;
			}
		}

		public static bool IsLogado
		{
			get
			{
				return (ContaLogada != null);
			}
		}

		public static CaixaEletronico CaixaEletronicoContext
		{
			get
			{
				//Se for contexto web recupera da session
				if (System.Web.HttpContext.Current != null)
				{
					string sessionName = string.Format("CaixaEletronicoContext{0}", System.Web.HttpContext.Current.Session.SessionID);
					object objCaixa = System.Web.HttpContext.Current.Session[sessionName];
					if (objCaixa != null && (objCaixa is CaixaEletronico))
						_caixaEletronico = (objCaixa as CaixaEletronico);
				}

				if (_caixaEletronico != null)
					_caixaEletronico = CaixaEletronicoBLL.GetByID(_caixaEletronico.ID);

				return _caixaEletronico;
			}

			set
			{
				_caixaEletronico = value;
				//Se for contexto web grava no session
				if (System.Web.HttpContext.Current != null)
				{
					string sessionName = string.Format("CaixaEletronicoContext{0}", System.Web.HttpContext.Current.Session.SessionID);
					System.Web.HttpContext.Current.Session[sessionName] = _caixaEletronico;
				}
			}
		}

		#endregion

		#region " Methods "

		#region " Get Methods "

		public static CaixaEletronico GetByID(int id)
		{
			return CaixaEletronicoDAO.GetByID(id);
		}

		#endregion

		#region " Management Methods "

		public static bool Saque(CaixaEletronico cx, Conta c, double valor)
		{
			bool success = false;

			// Verifica se o valor de saque é menor que o saldo do caixa
			if (valor > cx.Saldo)
				throw new Exception("Valor de saque inválido. O valor de saque é maior que o valor disponível no caixa.");

			// Efetua o saque da conta especificada
			success = ContaBLL.Saque(c, valor);

			// Remove o valor do saque do saldo do caixa
			if (success)
			{
				cx.Saldo -= valor;
				success = CaixaEletronicoDAO.Update(cx);
			}

			return success;
		}

		public static void Logoff()
		{
			ContaLogada = null;
		}

		#endregion

		#region " DDL Methods "

		public static int Insert(CaixaEletronico c)
		{
			c.ID = CaixaEletronicoDAO.Insert(c);

			return c.ID;
		}

		public static bool Update(CaixaEletronico c)
		{
			bool success = false;

			success = CaixaEletronicoDAO.Update(c);

			return success;
		}

		public static bool Delete(CaixaEletronico c)
		{
			bool success = false;

			success = CaixaEletronicoDAO.Delete(c);

			return success;
		}

		#endregion

		#endregion
	}
}
